package proyectoX;

import java.awt.Image;
import java.io.Serializable;
import java.util.ArrayList;

import javax.swing.ImageIcon;
/**
 * Clase que implementa la Grilla del juego.
 * @author Daprotis Mauro - Heiland Federico
 *
 */
public class Grilla implements Serializable {
	protected int[] inicio;
	protected int[] fin;
	protected Celda[][] matriz;
	protected ArrayList<Objeto> listaObjetos;
	/**
	 * Constructor que inicializa la grilla vacia.
	 */
	public Grilla(){
		matriz=new Celda[29][16];
		inicio=new int[2];
		fin=new int[2];
	}
	/**
	 * Constructor que inicia distintos niveles.
	 * @param niv nivel a generar.
	 */
	public Grilla(int niv){
		listaObjetos= new ArrayList<Objeto>();
		matriz= new Celda[29][16];
		inicio= new int[2];
		fin= new int[2];
		
    	for (int i=0;i<29;i++)
    		for (int j=0;j<16;j++)
    			matriz[i][j]=new Celda(1,null);
    	
    	switch (niv){
    	case 0: crearNivel1(); break;
    	case 1: crearNivel2(); break;
    	case 2: crearNivel3(); break;
    	
    	}
	}
    	
	private void crearNivel1(){
		setFinal(28,15);
		for (int i=2;i<6;i++){
    		for (int j=7;j<23;j++)
    		 			
    			setCelda(j,i,0,6);
    	}
		
		for (int i=7;i<23;i++){
			for (int j=6;j<8;j++){
				setCelda(i,j,1,5);
			}
		}
		
		for (int i=0;i<29;i++)
				{
				setCelda(i,9,0,-1);
				setCelda(i,10,2,-1);
				setCelda(i,11,2,-1);
				setCelda(i,12,0,-1);}
				setCelda(4,14,1,0);
				setCelda(5,14,1,0);
				setCelda(4,14,1,0);
				setCelda(5,15,1,1);
				setCelda(0,10,0,-1);
				setCelda(0,11,0,-1);
				setCelda(27,9,0,-1);
				setCelda(28,9,0,-1);
				setCelda(27,10,0,5);
				setCelda(28,10,0,7);
				setCelda(27,11,0,7);
				setCelda(28,11,0,7);
				setCelda(27,12,0,7);
				setCelda(28,12,0,7);
		
		
    	
    	for (int i=3;i<5;i++)
    		for (int j=12;j<18;j++)
    			setCelda(j,i,1,-1);
    	setCelda(14,3,1,4);
    	setCelda(15,4,1,2);
    	setCelda(17,3,1,3);
    	
    	for (int i=5;i<10;i++)
    		setCelda(i,1,3,-1);
    	for (int j=2;j<8;j++)
    		setCelda(5,j,3,-1);
    	for (int i=20;i<25;i++)
    		setCelda(i,1,3,-1);
    	for (int j=2;j<8;j++)
    		setCelda(24,j,3,-1);
    	
    
    	for (int f=0;f<29;f++)
    		for (int c=0;c<16;c++)
    			if (matriz[f][c].getObjeto()!=null)
    			{
    				matriz[f][c].getObjeto().setX(f*40);
    				matriz[f][c].getObjeto().setY(c*40);
    				listaObjetos.add(matriz[f][c].getObjeto());
    			}
    			
	
	}
	private void crearNivel3(){
		setFinal(28,15);
		for (int i=0;i<8;i++)
			for (int j=0;j<7;j++)
				setCelda(i,j,0,-1);
		for (int i=0;i<29;i++)
			for (int j=6;j<12;j++)
				setCelda(i,j,0,-1);
		for (int i=27;i<29;i++)
			for (int j=9;j<16;j++)
				setCelda(i,j,0,-1);
		for (int i=8;i<29;i++)
			for (int j=0;j<6;j++)
				setCelda(i,j,2,-1);
		for (int i=0;i<27;i++)
			for (int j=12;j<16;j++)
				setCelda(i,j,3,-1);
		for (int i=1;i<12;i++)
			setCelda(0,i,0,8);
		for (int i=0;i<28;i++)
			setCelda(i,11,0,8);
		for (int i=12;i<16;i++)
			setCelda(27,i,0,8);
		for (int i=0;i<6;i++)
			setCelda(7,i,0,5);
		for (int i=7;i<29;i++)
			setCelda(i,6,0,5);
		setCelda(9,9,1,6);
		setCelda(9,10,1,6);
		setCelda(11,8,1,6);
		setCelda(11,7,1,6);
		setCelda(14,9,0,7);
		setCelda(14,10,0,7);
		setCelda(16,8,0,7);
		setCelda(16,7,0,7);
		setCelda(18,9,0,7);
		setCelda(18,10,0,7);
		setCelda(21,8,0,6);
		setCelda(21,7,0,6);
		
		for (int i=19;i<29;i++){
			setCelda(i,9,1,-1);
			setCelda(i,10,1,-1);
		}
		
		for (int i=9;i<16;i++)
		{
			setCelda(26,i,1,-1);
			setCelda(27,i,1,-1);
		}
		for (int i=28;i<29;i++)
		{
			setCelda(i,14,1,-1);
			setCelda(i,15,1,-1);
		}
	
		setCelda(28,13,0,-1);
		setCelda(28,14,0,-1);
			
		setCelda(28,9,0,-1);
		setCelda(28,10,0,-1);
		
		for (int i=11;i<16;i++)
			setCelda(26,i,1,8);
		for (int i=9;i<16;i++)
			setCelda(28,i,1,-1);
		
		
		
		for (int f=0;f<29;f++)
    		for (int c=0;c<16;c++)
    			if (matriz[f][c].getObjeto()!=null)
    			{
    				matriz[f][c].getObjeto().setX(f*40);
    				matriz[f][c].getObjeto().setY(c*40);
    				listaObjetos.add(matriz[f][c].getObjeto());
    			}
		
	}
	
	private void crearNivel2(){
		for (int i=0;i<26;i++)
			setCelda(i,2,3,-1);
		for (int i=2;i<12;i++)
			setCelda(25,i,3,-1);
		for (int i=0;i<26;i++)
			setCelda(i,11,3,-1);
		for (int i=0;i<25;i++)
			for (int j=3;j<11;j++)
				setCelda(i,j,2,-1);
		setCelda(19,0,1,6);
		setCelda(19,1,1,6);
		setCelda(24,1,1,3);
		for (int i=26;i<29;i++)
		{	setCelda(i,5,1,5);
			setCelda(i,6,1,5);
		}
		
		for (int i=0;i<29;i++)
		{
			setCelda(i,12,0,-1);
			setCelda(i,13,0,-1);
			setCelda(i,14,0,-1);
			setCelda(i,15,0,-1);
		}
		
		for (int i=26;i<29;i++)
			for (int j=7;j<12;j++)
				setCelda(i,j,0,-1);
		int h=0;
		for (int i=11;i<15;i++)
		{
			
			setCelda(i,13,0,h);
			h++;
		}
		h=0;
		for (int i=18;i<22;i++)
		{
			setCelda(i,14,0,h++);
		}
		h=0;
		for (int i=25;i<29;i++)
			setCelda(i,15,0,h++);
		
		setFinal(0,15);
		for (int f=0;f<29;f++)
    		for (int c=0;c<16;c++)
    			if (matriz[f][c].getObjeto()!=null)
    			{
    				matriz[f][c].getObjeto().setX(f*40);
    				matriz[f][c].getObjeto().setY(c*40);
    				listaObjetos.add(matriz[f][c].getObjeto());
    			}
	}
	/**
	 * Setea el punto de inicio.
	 * @param f Fila del inicio.
	 * @param c Columna del inicio.
	 */
	public void setInicio(int f,int c){
		inicio[0]=f;
		inicio[1]=c;
	}
	/**
	 * Devuelve lista de objetos del nivel.
	 * @return Lista de objetos.
	 */
	public ArrayList<Objeto> getListaOb(){
		return listaObjetos;
	}
	/**
	 * Setea final de la grilla.
	 * @param f fila del final.
	 * @param c columna del final.
	 */
	public void setFinal(int f,int c){
		fin[0]=f;
		fin[1]=c;
	}
	/**
	 * Devuelve un arreglo con la fila y columna del inicio.
	 * @return arreglo con las coordenadas.
	 */
	public int[] getInicio(){
		return inicio;
	}
	/**
	 * Devuelve un arreglo con la fila y columna del final.
	 * @return arreglo con las coordenadas.
	 */
	public int[] getFinal(){
		return fin;
	}
	/**
	 * Devuelve la celda ubicada en la posicion dada por parametro, nula si la posicion no es valida.
	 * @param f fila
	 * @param c columna
	 * @return Celda en esa posicion.
	 */
	public Celda getCelda(int f, int c){
		if ((f<matriz.length)&&(c<matriz[0].length)&&(f>=0)&&(c>=0)	)	return matriz[f][c];
		else return null;
	}
	/**
	 * setea una celda en la posicion dada, del tipo indicado y con el objeto indicado.
	 * 
	 * @param f fila
	 * @param c columna
	 * @param tc tipo de celda
	 * @param to tipo de objeto (-1 para no poner objeto)
	 */
	public void setCelda(int f, int c, int tc,int to){
		Objeto o;
		Image imag;
		ImageIcon iic;
		switch (to){
		case 0:{ iic=new ImageIcon(this.getClass().getResource("/image/baliza40.png"));
				 imag= iic.getImage();		
				 o=new Coleccionable(to,iic,f,c);break;
				}
		case 1:{ iic=new ImageIcon(this.getClass().getResource("/image/cono40.png"));
		 		imag= iic.getImage();		
		 		o=new Coleccionable(to,iic,f,c);break;
				}				
		case 2:{ iic=new ImageIcon(this.getClass().getResource("/image/combustible40.png"));
				 imag= iic.getImage();
				 o=new Premio(to,iic,f,c);break; 
				 }
		case 3:{ iic=new ImageIcon(this.getClass().getResource("/image/balas.png"));
				 imag= iic.getImage();
				 o=new Premio(to,iic,f,c);break; 
		 }
		case 4:{ iic=new ImageIcon(this.getClass().getResource("/image/puntaje40.png"));
		 		 imag= iic.getImage();
		 		 o=new Premio(to,iic,f,c);break; 
				}
	
		case 5:{iic = new ImageIcon(this.getClass().getResource("/image/arbol40.png"));
	        imag = iic.getImage();			
			o=new Obstaculo(to,iic,f,c);break;
		}		
		case 6:{
			iic = new ImageIcon(this.getClass().getResource("/image/caja40.jpg"));
	        imag = iic.getImage();			
			o=new Obstaculo(to,iic,f,c);break;
		}
		case 7:{iic = new ImageIcon(this.getClass().getResource("/image/pared40.png"));
	        imag = iic.getImage();			
			o=new Obstaculo(to,iic,f,c);break;
		}
		case 8:{iic = new ImageIcon(this.getClass().getResource("/image/concreto40.jpg"));
        imag = iic.getImage();			
		o=new Obstaculo(to,iic,f,c);break;
	}		
		default: o=null;
		}
		matriz[f][c]=new Celda(tc,o);
	}
	

}
